package com.shiro1.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.realm.Realm;

public class MyRealm2 implements Realm{

	public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		//这些是用户发来需要验证的,比如在testCustomRealm测试方法中，发来了由zhang,123456构成的token
		//然后，我们从用户发来的token取出：身份与凭证。即用户名与密码。与"zhang"和"123456"来比较看是否一样
		//如果都一样，说明该用户是合法用户。那么我们要给shiro框架返回一个验证信息(AuthenticationInfo)
		//为什么要返回一个验证信息，返回真不就可以了么？
		
		String name  = (String) token.getPrincipal();//得到身份
		String password = new String((char[])token.getCredentials());//获取凭证
		
		//将用户身份与凭证用与数据源realm进行比较，验证通过，返回验证信息
		if(!"wang".equals(name)){
			throw new UnknownAccountException();//用户名未知
		}
		
		if(!"123456".equals(password)){
			throw new IncorrectCredentialsException();//错误的密码
		}
		
		return new SimpleAuthenticationInfo(name, password, getName());
	}

	public String getName() {
		return "myrealm2";
	}
	/**
	 * 仅支持最简的用户名与密码的验证
	 */
	public boolean supports(AuthenticationToken token) {
		return token instanceof UsernamePasswordToken;
	}

	
}
